<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 高阶函数 ：一个函数 有函数作为输入 或者是函数作为输出的函数 

        // 一、函数作为输入的函数 ，回调函数 callback

        // function func(a,b){  // b = fucntion(){}
        //     // console.log(a,b);
        //     console.log(111);
        //     var num = 10;
        //     b && b(num,20);  // 容错方式 ，回调函数可以传入 ，也可以不传入
        //     // if(b){
        //     //     b();
        //     // }
        // }

        // func(1,function(mynum,mynum2){
        //     console.log(123,mynum);
        // });  // 调用的时候，传递一个函数 ，回头在调用传递的这个函数



        // 二 、一个函数作为另外一个函数的输出 

        // function fn(){
        //     console.log(111)
        //     return function(){
        //         console.log(222);
        //     }
        // }

        // fn()();

    //     function add(a){
    //         return function(b){
    //             return function(c){
    //                 return a + b + c;
    //             }
    //         }
    //     }
    //   var res =   add(1)(2)(3);
    //   console.log(res);


//     function add(a,b,c){
//         return a + b + c;
//     }
// //    console.log(  add.length);

//     // add(1,2,3); // 3元函数  ----> 函数调用转成 一元调用
//     // 把多元参数转换成一元参数调用形式 ，柯里化
//     function curry(add){
//         return function(a){
//             return function(b){
//                 return function(c){
//                     return add(a,b,c);
//                 }
//             }
//         }
//     }

//     var myfn = curry(add);
//     console.log( myfn(1)(2)(3));


    // 闭包 ：缓存 

    // 判断某个函数 是否执行过了

    function fn(){
        console.log("我是fn函数");
    }

    function once(fn){
        var isExec = false; // 没有执行
        return function(){
            if(!isExec){
                fn();
                isExec = true;
            }else{
                console.log("fn函数已经被执行过了")
            }
        }
    }

    var myfn = once(fn);
    myfn();
    myfn();
    myfn();

    </script>
</body>
</html>